// // ts 的核心原则之一是对值所具有的结构进行类型检查。我们使用接口（Interfaces）来定义对象的类型。接口是对象的状态（属性）和行为（方法）的抽象（描述）

// // 初步认识
// // 需求一 
// /*
// 需求: 创建人的对象, 需要对人的属性进行一定的约束
//   id是number类型, 必须有, 只读的
//   name是string类型, 必须有
//   age是number类型, 必须有
//   sex是string类型, 可以没有
// */
// // 定义人的接口
// interface IPPerson {
//   id: number
//   name: string
//   age: number
//   sex: string
// }

// const person1: IPPerson = {
//   id: 1,
//   name: 'Bob',
//   age: 12,
//   sex: 'w'
// }

// // 属性可选
// interface Dog {
//   id: number,
//   name: string,
//   sex?: string
// }

// const dog1: Dog = {
//   id: 1,
//   name: 'Bob'
//   // sex: 'm' // 可选
// }

// // 属性只读
// interface Cat {
//   readonly id: number,
//   name: string
// }

// let cat: Cat = {
//   id: 10,
//   name: 'Bob'
// }
// // cat.id = 12 // Error

// // 函数类型
// interface Foo {
//   (firstName: string, lastName: string): string
// }

// const getFullName: Foo = (firstName: string, lastName: string): string => {
//   return firstName + '_' + lastName
// }

// console.log(getFullName('东方', '不败'));

// // 类类型

// interface UserInfo {
//   username: string
//   password: string
// }

// interface Join {
//   regist(): boolean
//   login(id: number): UserInfo
// }

// interface Exit {
//   logout(): boolean
// }

// class Poc implements Join, Exit {

//   username: string = 'Bob'
//   password: string = 'Pop'

//   constructor(user: string, pass: string) {
//     this.username = user
//     this.password = pass
//     console.log('[Poc] init ...');
//   }

//   regist() {
//     console.log('[Poc] regist ...');
//     return true
//   }

//   login(id: number) {
//     console.log('[Poc] login ...');
//     return {
//       username: 'user' + id,
//       password: 'pass' + id
//     }
//   }

//   logout() {
//     console.log('[Poc] logout ...');
//     return true
//   }

// }

// let Ppoc: Poc = new Poc('Jhon', 'Bob')
// Ppoc.regist()
// Ppoc.login(12)
// Ppoc.logout()

// // 接口继承接口

// interface UserOperate extends Join, Exit {
//   play(): string
// }

// class PocPlus implements UserOperate {
//   username: string = 'Bob'
//   password: string = 'Pop'

//   constructor(user: string, pass: string) {
//     this.username = user
//     this.password = pass
//     console.log('[PocPlus] init ...');
//   }

//   regist() {
//     console.log('[PocPlus] regist ...');
//     return true
//   }

//   login(id: number) {
//     console.log('[PocPlus] login ...');
//     return {
//       username: 'user' + id,
//       password: 'pass' + id
//     }
//   }

//   play() {
//     console.log('[PocPlus] playing ...');
//     return this.username + ' is played.'
//   }

//   logout() {
//     console.log('[PocPlus] logout ...');
//     return true
//   }
// }

// let PocP: PocPlus = new PocPlus('Jhon', 'Bob')
// PocP.regist()
// PocP.login(12)
// PocP.play()
// PocP.logout()
